/*
 * TirageDes.java
 * Classe d'affichage d'un tirage de des
 *
 */



package Risk.IHM;

import Risk.Moteur.Carte;
import Risk.Moteur.Jeu;
import Risk.Moteur.Joueur;
import Risk.Moteur.Pays;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.ArrayList;
import java.util.Collections;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;

/**
 * En cours de construction
 * @author nicoleta
 */
public class TirageDes extends JDialog implements ActionListener {

    // constantes
    private static final String		cheminFichImages = "Images/Icons/";
    private static String[]		faces            = {
	"un_de.jpg", "deux_de.jpg", "trois_de.jpg", "quatre_de.jpg", "cinq_de.jpg", "six_de.jpg"
    };
    private static final String		imageDe          = "de.jpg";
    private static final String[]	imagesJoueurs    = { "attaque.png", "defense.png" };
    private static TirageDes		instance         = null;
    private static final long		serialVersionUID = 1L;
    private ArrayList<JLabel>		alJLabelDesA, alJLabelDesD;
    private JButton			jbLanceDes, jbRetraite,	jbDeplacement, jbToutDeplacer;

    // composantes graphiques
    // butons
    private JLabel	jlJoueurAttaque, jlJoueurDefend;
    private JLabel	jlText;
    private JLabel	jlUnDeA, jlDeuxDesA, jlTroisDesA, jlUnDeD, jlDeuxDesD;

    // radio buttons et labels pour les des
    private JRadioButton	jrbUnDeA, jrbDeuxDesA, jrbTroisDesA, jrbUnDeD, jrbDeuxDesD;

    // slider
    private JSlider	jsDeplaceArmees;
    private int		maxArmees, minArmees;

    // panels attaque et defense
    private JPanel	pDesA, pDesD;

    // recupere des informations sur le Pays
    private Pays	paysA, paysD;
    private PlateauIhm	pihm;

    /**
     * constructeur
     * @param cAttaquant - la couleur du joueur qui attaque
     * @param cDefenseur - la couleur du joueur qui defend
     */
    private TirageDes(Pays pAttaque, Pays pDefend, PlateauIhm pihm) {
	super(pihm, " Tirage des ");
	this.pihm = pihm;
	this.setLayout(new GridLayout(4, 1));
	this.setLocation(150, 150);
	paysA     = pAttaque;
	paysD     = pDefend;
	minArmees = 1;
	maxArmees = paysA.getNbArmee() - 1;
	initComponents(this, pAttaque, pDefend);
	this.setSize(600, 450);
	this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
	if (e.getSource().equals(jbLanceDes)) {
	    Joueur	jAtt = paysA.getJoueur();
	    Joueur	jDef = paysD.getJoueur();

	    // Lancement des des
	    // Combien pour l'attaquant
	    int	nbAttaquant = 1;

	    if (jrbDeuxDesA.isSelected()) {
		nbAttaquant = 2;
	    } else if (jrbTroisDesA.isSelected()) {
		nbAttaquant = 3;
	    }

	    // Combien pour le defenseur
	    int	nbDefenseur = 1;

	    if (jrbDeuxDesD.isSelected()) {
		nbDefenseur = 2;
	    }

	    // Tirage des
	    ArrayList<Integer>	desA = Jeu.jetAttaquant(nbAttaquant, paysA);
	    ArrayList<Integer>	desD = Jeu.jetDefenseur(nbDefenseur, paysD);

	    // ATTAQUE avec le moteur du jeu
	    int	retour = pihm.getRisk().joueurCourantAttaque(paysA, paysD, desA, desD);

	    if (retour == Pays.ERREUR) {
		System.out.println("Erreur attaque dans action performed de TirageDes");

		return;
	    }

	    afficherDes(desA, desD);

	    // test du resultat
	    if (retour == Jeu.FIN_PARTIE) {
		if (ConnexionServeurIHM.CONNECTE) {
		    pihm.getJtaConsole().append(pihm.getRisk().getTc().finDePartie());
		}

		pihm.finPartie(pihm.getRisk().getJoueurCourant());
	    } else if (retour != Pays.NULL) {    // victoire
		if (pihm.getRisk().estMort(jDef)) {//joueur defenseur est mort ?
		    pihm.majListeCouleur();

		    for (Carte card : jDef.getCartesEnMain()) {//si oui, il donne ces cartes au vainqueur
			jAtt.ajouteCarteBonus(card);
		    }
		}

		if (paysA.getNbArmee() - 1 > 0) {
		    jbLanceDes.setEnabled(false);
		    jlText.setText(("Voulez-vous déplacer plus de soldats ? (par defaut, " + desA.size()
				    + " soldats seront deplace(s))").toUpperCase());

		    // Activer JSlider
		    jsDeplaceArmees.setEnabled(true);
		    jsDeplaceArmees.setMaximum(paysA.getNbArmee() - 1);
		    jsDeplaceArmees.setMinimum(0);

		    // Activer bouton valider deplacement ainsi que le bouton pour tout deplacer
		    jbDeplacement.setEnabled(true);
		    jbToutDeplacer.setEnabled(true);
		} else {
		    pihm.setJBTirDe(false);
		    ImageCarte.ma_carte.desurligner();
		    setVisible(false);
		}
	    } else {    // defenseur nest pas mort
		jlText.setText("Nouvelle Attaque ?".toUpperCase());
	    }

	    // !!!! mise a jour sur les labels du nombre d'armees apres chaque tirage aux des
	    majNbArmeesLabels(paysA, paysD);
	    majDesDefense();
	    majDesAttaque();
	    pihm.getImgCarte().repaint();
	}

	if (e.getSource().equals(jbDeplacement)) {
	    int	nb = jsDeplaceArmees.getValue();

	    // deplacement
	    if (nb > 0) {
		pihm.getRisk().manoeuvreJoueurCourant(paysA, paysD, nb);

		if (ConnexionServeurIHM.CONNECTE) {
		    pihm.getJtaConsole().append(pihm.getRisk().getTc().envoieInformationsPays(paysA) + "\n");
		    pihm.getJtaConsole().append(pihm.getRisk().getTc().envoieInformationsPays(paysD) + "\n");
		}
	    }

	    // maj ihm
	    pihm.modifierTexte("Deplacement de " + nb + " soldats de " + paysA + " vers " + paysD);
	    pihm.getImgCarte().majCoulTextePays(paysD);
	    ImageCarte.ma_carte.repaint();
	    ImageCarte.ma_carte.desurligner();
	    pihm.setJBTirDe(false);
	    this.setVisible(false);
	}

	if (e.getSource().equals(jbToutDeplacer)) {
	    int	nb = paysA.getNbArmee() - 1;

	    // deplacement
	    pihm.getRisk().manoeuvreJoueurCourant(paysA, paysD, nb);
	    jsDeplaceArmees.setValue(nb);

	    if (ConnexionServeurIHM.CONNECTE) {
		pihm.getJtaConsole().append(pihm.getRisk().getTc().envoieInformationsPays(paysA) + "\n");
		pihm.getJtaConsole().append(pihm.getRisk().getTc().envoieInformationsPays(paysD) + "\n");
	    }

	    // maj ihm
	    pihm.modifierTexte("Deplacement de " + nb + " soldats de " + paysA + " vers " + paysD);
	    pihm.getImgCarte().majCoulTextePays(paysD);
	    ImageCarte.ma_carte.repaint();
	    ImageCarte.ma_carte.desurligner();
	    pihm.setJBTirDe(false);
	    this.setVisible(false);
	}

	if (e.getSource().equals(jbRetraite)) {
	    ImageCarte.ma_carte.desurligner();
	    pihm.setJBTirDe(false);
	    this.setVisible(false);
	}
    }

    public void afficher(ArrayList<Integer> l) {
	String	s = "";

	for (int i = 0; i < l.size(); i++) {
	    if (i == l.size() - 1) {
		s += l.get(i);
	    } else {
		s += l.get(i) + " - ";
	    }
	}

	pihm.jtaInfo.setText(pihm.jtaInfo.getText() + (s).toUpperCase());
    }

    private void afficherDes(ArrayList<Integer> desA, ArrayList<Integer> desD) {

	// tri des des
	Collections.sort(desA);
	Collections.reverse(desA);
	Collections.sort(desD);
	Collections.reverse(desD);

	// affichage des tirages dans le panneau
	pihm.modifierTexte("Des attaquant : ");
	afficher(desA);
	pihm.jtaInfo.setText(pihm.jtaInfo.getText() + "\n");
	pihm.jtaInfo.setText(pihm.jtaInfo.getText() + ("Des defenseur : ").toUpperCase());
	afficher(desD);
	pihm.jtaInfo.updateUI();

	// affichage des tirages graphiquement
	for (int i = 0; i < alJLabelDesA.size(); i++) {
	    if (i < desA.size()) {
		changerImage(alJLabelDesA.get(i), faces[ desA.get(i) - 1 ]);
	    } else {
		changerImage(alJLabelDesA.get(i), imageDe);
	    }
	}

	for (int i = 0; i < alJLabelDesD.size(); i++) {
	    if (i < desD.size()) {
		changerImage(alJLabelDesD.get(i), faces[ desD.get(i) - 1 ]);
	    } else {
		changerImage(alJLabelDesD.get(i), imageDe);
	    }
	}
    }

    public void changerImage(JLabel jl, String img) {
	ImageIcon	ic = new ImageIcon(cheminFichImages + img);

	ic.setImage(ic.getImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT));
	jl.setIcon(ic);
	jl.setAlignmentY(CENTER_ALIGNMENT);
    }

    public JPanel factoryPanel(JRadioButton jrb, JLabel jl) {
	JPanel	p = new JPanel(new BorderLayout());

	changerImage(jl, TirageDes.imageDe);
	p.add(jrb, BorderLayout.WEST);
	p.add(jl, BorderLayout.CENTER);

	return p;
    }

    public void initComponents(JDialog f, Pays pAtk, Pays pDef) {

	// contient les boutons des joueurs
	JPanel	jpHaut = new JPanel(new GridLayout(1, 2));

	// IMPORTANT mettre le nom du pays et le nombre d'armees apres chaque tirage des des
	jlJoueurAttaque = new JLabel("", 0);
	jlJoueurDefend  = new JLabel("", 0);
	majNbArmeesLabels(pAtk, pDef);

	// mettre la couleur du joueur qui decide d'attaquer
	jlJoueurAttaque.setBackground(pAtk.getJoueur().getCouleur());
	jlJoueurDefend.setBackground(pDef.getJoueur().getCouleur());
	jlJoueurAttaque.setOpaque(true);
	jlJoueurDefend.setOpaque(true);

	// mettre une image
	jlJoueurAttaque.setIcon(new ImageIcon(cheminFichImages + imagesJoueurs[ 0 ]));
	jlJoueurDefend.setIcon(new ImageIcon(cheminFichImages + imagesJoueurs[ 1 ]));
	jpHaut.add(jlJoueurAttaque);
	jpHaut.add(jlJoueurDefend);

	// contient les boutons et les images des des
	JPanel	jpCentre = new JPanel(new BorderLayout());

	pDesA = panelDesAttaque();
	pDesD = panelDesDefense();

	JPanel	jsp = new JPanel(new GridLayout(1, 2));

	jsp.add(pDesA);
	jsp.add(pDesD);
	jpCentre.add(jsp);

	JPanel	jpSlider = new JPanel(new GridLayout(2, 1));

	jlText          = new JLabel("", 0);
	jsDeplaceArmees = new JSlider(minArmees, maxArmees, minArmees);
	jsDeplaceArmees.setEnabled(false);
	jsDeplaceArmees.setMajorTickSpacing(1);
	jsDeplaceArmees.setMinorTickSpacing(1);
	jsDeplaceArmees.setPaintTicks(true);
	jsDeplaceArmees.setPaintLabels(true);
	jpSlider.add(jlText);
	jpSlider.add(jsDeplaceArmees);

	JPanel	jpBas = new JPanel(new GridLayout(1, 4));

	jbLanceDes = new JButton(" Lancer les des ! ");
	jbLanceDes.addActionListener(this);
	jbRetraite = new JButton(" Annuler ");
	jbRetraite.addActionListener(this);
	jbDeplacement = new JButton("Deplacer");
	jbDeplacement.setEnabled(false);
	jbDeplacement.addActionListener(this);
	jbToutDeplacer = new JButton("Tout deplacer");
	jbToutDeplacer.addActionListener(this);
	jbToutDeplacer.setEnabled(false);
	jpBas.add(jbLanceDes);
	jpBas.add(jbDeplacement);
	jpBas.add(jbToutDeplacer);
	jpBas.add(jbRetraite);

	// ajout a la frame
	f.add(jpHaut);
	f.add(jpCentre);
	f.add(jpSlider);
	f.add(jpBas);
    }

    public void majDesAttaque() {
	switch (paysA.getNbArmee()) {
	case 1 :
	    jrbUnDeA.setEnabled(false);
	    jrbUnDeA.setEnabled(false);
	    jrbDeuxDesA.setEnabled(false);
	    jlDeuxDesA.setEnabled(false);
	    jrbTroisDesA.setEnabled(false);
	    jlTroisDesA.setEnabled(false);
	    pihm.setJBTirDe(false);
	    ImageCarte.ma_carte.desurligner();
	    this.setVisible(false);

	    break;

	case 2 :
	    jrbUnDeA.setSelected(true);
	    jrbDeuxDesA.setEnabled(false);
	    jlDeuxDesA.setEnabled(false);
	    jrbTroisDesA.setEnabled(false);
	    jlTroisDesA.setEnabled(false);

	    break;

	case 3 :
	    jrbDeuxDesA.setSelected(true);
	    jrbTroisDesA.setEnabled(false);
	    jlTroisDesA.setEnabled(false);

	    break;

	default :
	    jrbTroisDesA.setSelected(true);

	    break;
	}
    }

    public void majDesDefense() {
	switch (paysD.getNbArmee()) {
	case 0 :
	    jrbUnDeD.setEnabled(false);
	    jrbUnDeD.setEnabled(false);
	    jrbDeuxDesD.setEnabled(false);
	    jlDeuxDesD.setEnabled(false);

	    break;

	case 1 :
	    jrbUnDeD.setSelected(true);
	    jrbDeuxDesD.setEnabled(false);
	    jlDeuxDesD.setEnabled(false);

	    break;

	default :
	    jrbDeuxDesD.setSelected(true);

	    break;
	}
    }

    private void majNbArmeesLabels(Pays pAtk, Pays pDef) {
	jlJoueurAttaque.setText("" + (pAtk.getNom() + " | armees : " + pAtk.getNbArmee()));
	jlJoueurDefend.setText("" + (pDef.getNom() + " | armees : " + pDef.getNbArmee()));
	jlJoueurDefend.setBackground(pDef.getJoueur().getCouleur());

	/* Ecriture en noir ou en blanc du nb d'armees sur les labels du tirage des des */
	int	r = pAtk.getJoueur().getCouleur().getRed();
	int	g = pAtk.getJoueur().getCouleur().getGreen();
	int	b = pAtk.getJoueur().getCouleur().getBlue();

	// attaque
	if (((r + g + b) / 3.0) > 122.5) {
	    jlJoueurAttaque.setForeground(Color.BLACK);
	} else {
	    jlJoueurAttaque.setForeground(Color.WHITE);
	}

	// defense
	r = pDef.getJoueur().getCouleur().getRed();
	g = pDef.getJoueur().getCouleur().getGreen();
	b = pDef.getJoueur().getCouleur().getBlue();

	if (((r + g + b) / 3.0) > 122.5) {
	    jlJoueurDefend.setForeground(Color.BLACK);
	} else {
	    jlJoueurDefend.setForeground(Color.WHITE);
	}
    }

    /**
     * panel des des de l'attaquant
     * @return le panel
     */
    public JPanel panelDesAttaque() {
	JPanel		jp  = new JPanel(new GridLayout(3, 1));
	ButtonGroup	bgA = new ButtonGroup();

	alJLabelDesA = new ArrayList<JLabel>();
	jrbUnDeA     = new JRadioButton("1");
	bgA.add(jrbUnDeA);
	jlUnDeA = new JLabel("", 0);
	jp.add(factoryPanel(jrbUnDeA, jlUnDeA));
	jrbDeuxDesA = new JRadioButton("2");
	bgA.add(jrbDeuxDesA);
	jlDeuxDesA = new JLabel("", 0);
	jp.add(factoryPanel(jrbDeuxDesA, jlDeuxDesA));
	jrbTroisDesA = new JRadioButton("3");
	bgA.add(jrbTroisDesA);
	jlTroisDesA = new JLabel("", 0);
	jp.add(factoryPanel(jrbTroisDesA, jlTroisDesA));
	alJLabelDesA.add(jlUnDeA);
	alJLabelDesA.add(jlDeuxDesA);
	alJLabelDesA.add(jlTroisDesA);
	majDesAttaque();

	return jp;
    }

    /**
     * panel de des du defenseur
     * @return le panel
     */
    public JPanel panelDesDefense() {
	JPanel	jp = new JPanel(new GridLayout(3, 1));

	alJLabelDesD = new ArrayList<JLabel>();

	// radio buttons
	ButtonGroup	bgD = new ButtonGroup();

	jrbUnDeD = new JRadioButton("1");
	bgD.add(jrbUnDeD);
	jlUnDeD = new JLabel("", 0);
	jp.add(factoryPanel(jrbUnDeD, jlUnDeD));
	jrbDeuxDesD = new JRadioButton("2");
	bgD.add(jrbDeuxDesD);
	jlDeuxDesD = new JLabel("", 0);
	jp.add(factoryPanel(jrbDeuxDesD, jlDeuxDesD));
	alJLabelDesD.add(jlUnDeD);
	alJLabelDesD.add(jlDeuxDesD);

	// mise a jour des des
	majDesDefense();

	return jp;
    }

    public static TirageDes getInstance(Pays pAttaque, Pays pDefend, PlateauIhm pihm) {
	if (instance == null) {
	    instance = new TirageDes(pAttaque, pDefend, pihm);
	}

	instance.getContentPane().removeAll();
	instance.setPaysA(pAttaque);
	instance.setPaysD(pDefend);
	instance.setMinArmees(1);
	instance.setMaxArmees(pAttaque.getNbArmee() - 1);
	instance.initComponents(instance, pAttaque, pDefend);
	instance.setSize(600, 450);
	instance.setVisible(true);

	return instance;
    }

    public void setMaxArmees(int maxArmees) {
	this.maxArmees = maxArmees;
    }

    public void setMinArmees(int minArmees) {
	this.minArmees = minArmees;
    }

    public void setPaysA(Pays paysA) {
	this.paysA = paysA;
    }

    public void setPaysD(Pays paysD) {
	this.paysD = paysD;
    }
}
